package cn.HuanG.base.service.impl;

import cn.HuanG.base.service.ICodeService;
import cn.HuanG.util.StrUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class CodeServiceImpl implements ICodeService {
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void sendCode(Map<String, String> map) {

        //获取手机号
        String phone = map.get("phone");
        String codeType = map.get("codeType");
        System.out.println(codeType);
        //调用工具类随机生成验证码
        String code = StrUtils.getRandomString(6);
        /*
            判断请求的合法性【一分钟内容同一手机号重复发送问题】
            1.redis存储验证码发送的时间
               key       value
            15008495702  9527
            存储时间
               key       value
            15008495702  9527:时间戳
            2.根据手机号获取 验证码 --9527:时间戳  使用:分割
            使用当前时间-存储时间<60 请求不合法

         */
        //获取存在redis中的数据
        String codeInRedis  = (String)redisTemplate.opsForValue().get(phone+":"+codeType);
        //判断数据是否存在
        if (codeInRedis !=null){
            //如果有数据则截取保存在数据里的时间戳
            String oldTime = codeInRedis.split(":")[1];
            //使用时间戳和当前事件判断
            if (System.currentTimeMillis()-Long.valueOf(oldTime)<60*1000){
                //在一分钟内，返回操作频繁
                throw new RuntimeException("操作过于频繁，请稍后再试");
            }else {
                //如果验证码时间大于一分钟，则获取redis内存的验证码，提供到下面使用
                code = codeInRedis.split(":")[0];
            }
        }
        //调用工具类让运营商发送验证码
        //SmsUtils.send(phone,code);
        //把验证码保存在redis,为了避免重复发送验证码，给验证码加上时间戳
        String codeTime = code+":"+System.currentTimeMillis();
        redisTemplate.opsForValue().set(phone+":"+codeType,codeTime,5, TimeUnit.MINUTES);
        System.out.println(code);
    }
}
